from datetime import datetime
import os
import socket
import tkinter as tk
import threading
from tkinter import filedialog

# 创建主窗口
root = tk.Tk()

root.title("HotTransfer Client")

# 始终置顶
# root.wm_attributes("-topmost", True)

# 禁止调整窗口大小 (宽度不可变, 高度不可变)
root.resizable(width=False, height=False)

# 输入框绑定变量
file_selected_var = tk.StringVar()


def select_file():
    # 打开文件选择对话框
    file_path = filedialog.askopenfilename(
        title="选择文件", filetypes=[("所有文件", "*.*")]
    )
    if file_path:
        file_selected_var.set(file_path)


def send_file(server_ip, server_port):
    file_path = file_selected_var.get()
    try:
        # 使用 with 语句管理套接字
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
            # 连接到服务器
            client_socket.connect((server_ip, server_port))

            # 获取并发送文件名
            file_name = os.path.basename(file_path)
            client_socket.sendall(
                file_name.encode() + b"\n"
            )  # 发送文件名并以换行符标识文件名的结束

            # 发送文件内容
            with open(file_path, "rb") as file:
                while True:
                    data = file.read(1024)
                    if not data:
                        break
                    client_socket.send(data)

        tips_label.config(fg="green", text="传输完成")
    except Exception as e:
        tips_label.config(fg="red", text=f"传输失败: {e}")


def start_client():
    # 以新的线程启动
    threading.Thread(
        target=send_file,
        args=(ip_address_entry.get(), int(port_entry.get())),
        daemon=True,  # 设置为守护线程，随主线程退出
    ).start()
    tips_label.config(fg="#fd6e43", text="正在传输...")


# IP 地址 标签
ip_address_label = tk.Label(
    root,
    text="IP 地址：",  # 显示的文本
    font=("Kaiti", 14),  # 字体和大小
    fg="darkblue",  # 前景文字颜色
)
ip_address_label.grid(row=0, column=0, padx=(20, 0), pady=(20, 0))  # 第 0 行，第 0 列

# IP 地址 输入框
ip_address_entry = tk.Entry(root, width=20)
ip_address_entry.grid(row=0, column=1, padx=(0, 20), pady=(20, 0))  # 第 0 行，第 1 列

# 端口 标签
port_label = tk.Label(
    root,
    text="端口：",
    font=("Kaiti", 14),
    fg="darkblue",
)
port_label.grid(row=1, column=0, padx=(20, 0), pady=(20, 0))

# 端口 输入框
port_entry = tk.Entry(root, width=20)
port_entry.grid(row=1, column=1, padx=(0, 20), pady=(20, 0))

# 选择文件 按钮
select_file_button = tk.Button(root, text="选择文件", command=select_file)
select_file_button.grid(row=2, column=0, padx=(20, 0), pady=(20, 0))

# 选择文件 文件选择框
select_file_entry = tk.Entry(root, textvariable=file_selected_var)
select_file_entry.grid(row=2, column=1, padx=(0, 20), pady=(20, 0))

# 开始传输 按钮
start_client_button = tk.Button(root, text="开始传输", command=start_client)
start_client_button.grid(row=3, column=0, padx=(20, 0), pady=(20, 20))

# 提示文字 标签
tips_label = tk.Label(
    root,
    text="准备传输",
    font=("Kaiti", 12),
    fg="green",
    width=10,
    height=1,
)
tips_label.grid(row=3, column=1, pady=(20, 20))

# 更新窗口以计算正确的大小
root.update_idletasks()

# 获取窗口大小
window_width = root.winfo_width()
window_height = root.winfo_height()

# 获取屏幕的宽高
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# 计算窗口左上角的坐标 (x, y) 以使窗口居中
x = (screen_width // 2) - (window_width // 2)
y = (screen_height // 2) - (window_height // 2)

# 设置窗口的位置，只设置偏移，不改变窗口大小
root.geometry(f"+{x}+{y}")

# 进入主循环
root.mainloop()
